package com.example.common.view.vm

import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.common.view.model.BaseRepository
import com.example.common.view.model.IResultData
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.newFixedThreadPoolContext
import kotlinx.coroutines.newSingleThreadContext
import java.util.concurrent.Executor
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors

//基础ViewModel层
    //ViewModel和AndroidViewModel主要区别：在于是否需要上下文对象、
    //ViewModel中业务：利用携程获取网络请求，使用LiveData或StateFlow来管理数据，通知View层获取数据变化
    //以前使用LiveData来缓存数据，存在数据倒灌问题，官方推荐在Kotlin中使用Flow流，如果是Java中官方推荐使用SingeLiveEvent或upPeekLiveData
abstract class BaseViewModel<Repo:BaseRepository<*>, RD:IResultData> : ViewModel(){
    //定义LiveData缓存数据
    protected val mSuccessLiveData = MutableLiveData<RD>()
    protected val mErrorLiveData = MutableLiveData<String>()

    //携程异常处理
    private val mExcepytionHander = CoroutineExceptionHandler{ctx,exception ->
        Log.e("Coroutine Error","Exception ===>\n"+exception.message)
        mErrorLiveData.postValue("viewModel层发生异常："+exception.message)
    }

    //自定义携程作用域,SupervisorJob()创建独立协程作用域，避免影响父协程和同级协程
    protected val mViewModelScope = CoroutineScope(Dispatchers.Main + SupervisorJob() + mExcepytionHander)
    //自定义携程调度器（线程池）
    protected val mDispatcher = Executors.newFixedThreadPool(10).asCoroutineDispatcher()//使用Java的方式创建线程池

    protected val mSingeDispatcher = newSingleThreadContext("SingleTreadDispatcher")//使用Kotlin中函数创建单线程线程池
    protected val mFixedThreadDispatcher = newFixedThreadPoolContext(16,"SingleTreadDispatcher")//使用Kotlin中函数创建固定数量线程线程池




}